Queue (佇列) 與 Stack 一樣,是一種線性資料結構,但它遵循的是先進先出 (First-In-First-Out; FIFO) 的規則。你可以把 Queue 想像成排隊買票: 最早排隊的人會最先買到票並離開,而新加入的人只能站在隊伍最後。
簡單來說,Queue 的操作只允許在「尾端」加入元素,在「前端」移除元素。
Queue 與 Stack 的差異就在於操作的方向:
其實 Queue 跟 Stack 差不多,操作都很簡單,直接使用 Python 來自定義一個 Queue 的資料結構,來進行演示。
Create a Queue class
和 Stack 一樣,先建立建構子與迭代器,使用 Python 的 list 模擬:
class Queue:
def __init__(self):
self.data = []
def __iter__(self):
for item in self.data:
yield item
Create an enqueue() method
enqueue 就是將元素加到尾端,對應到 Python list 的 append()
。
class Queue:
def __init__(self):
self.data = []
def __iter__(self):
for item in self.data:
yield item
def enqueue(self, item):
self.data.append(item)
Create a dequeue() method
dequeue 是移除前端元素,對應到 Python list 的 pop(0)
。
class Queue:
def __init__(self):
self.data = []
def __iter__(self):
for item in self.data:
yield item
def enqueue(self, item):
self.data.append(item)
def dequeue(self):
return self.data.pop(0)
Create a peek() method
peek 是查看前端的元素,但不移除。
class Queue:
def __init__(self):
self.data = []
def __iter__(self):
for item in self.data:
yield item
def enqueue(self, item):
self.data.append(item)
def dequeue(self):
return self.data.pop(0)
def peek(self):
return self.data[0]
Create an is_empty() method
檢查 Queue 是否為空。
class Queue:
def __init__(self):
self.data = []
def __iter__(self):
for item in self.data:
yield item
def enqueue(self, item):
self.data.append(item)
def dequeue(self):
return self.data.pop(0)
def peek(self):
return self.data[0]
def is_empty(self):
return self.data == []
今天介紹了 Queue,這是一種限制操作位置的線性資料結構,與 Stack 最大的不同是遵循 FIFO,新元素只能從尾端加入,舊元素只能從前端移除。
Queue 在日常生活與程式設計中都非常常見,例如: 作業系統的工作排程、網路中的封包緩衝區、樹或圖的廣度優先搜尋 (BFS) 等,都需要用到 Queue。
在 Python 中,可以用 list 或 collections.deque 來實作 Queue;在 Java 中,常用 LinkedList 或 ArrayDeque。雖然實作方式不同,但本質上都保留了 Queue 的特性。